package clases;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class CasoDePrueba implements Cloneable {
	
	public Integer v = new Integer(0);
	public Integer c = new Integer(0);
	public ArrayList<ArrayList<Integer>> clausulas = new ArrayList<ArrayList<Integer>>();
	public ArrayList<ArrayList<Integer>> clausulasAlFinal = new ArrayList<ArrayList<Integer>>();
	public int[] positivos;
	public int[] negativos;
	public int cantidadSol = 0;
	public int[] seteados;
	
	
	
	
	
	public CasoDePrueba(Integer cantClau, Integer vars) {
		c = cantClau;
		v = vars;
		positivos = new int[v];
		negativos = new int[v];
		seteados = new int[v];
		
		
	}
	
	public CasoDePrueba(CasoDePrueba cp ) {
		this.c = cp.c;
		this.v = cp.v;
		this.clausulas = new ArrayList<ArrayList<Integer>>(cp.clausulas);
		this.clausulasAlFinal = new ArrayList<ArrayList<Integer>>(cp.clausulasAlFinal);
		this.cantidadSol = cp.cantidadSol;
		
		this.positivos = new int[this.v];
		this.negativos = new int[this.v];
		this.seteados = new int[this.v];
		
		for (int i = 0; i < positivos.length; i++) {
			this.positivos[i] =  cp.positivos[i];
			this.negativos[i] =  cp.negativos[i];
			this.seteados[i]  =  cp.seteados[i];
		}
		
	}

	public void agregarClausula(ArrayList<Integer> clausula, int i )  {
		int resultados = llenarPositivosYNegativos(clausula, i);
		if(resultados == -1){
			clausulas.add(clausula);
		} else {
			ArrayList<Integer> aux = new ArrayList<Integer>();
			aux.add(resultados);
			aux.add(i);
			clausulasAlFinal.add(aux);
		}
			
	}

	private int llenarPositivosYNegativos(ArrayList<Integer> clausula, int nroClausula) {
		Set<Integer> variables = new HashSet<Integer>();
		for (Integer var : clausula) {
			if(var > 0){
				positivos[var-1]++;
			} else {
				negativos[Math.abs(var)-1]++;
			}
			
			variables.add(var);
			
			if (variables.contains((-1) * var)){
				//Si contiene p y no p, saco todas las variables de la clausula de los contadores de positivos y negativos, ya que no me sirven
				sacarVariablesQueNoSirven(variables, var);
				cantidadSol++;
				return Math.abs(var);
			}
		}
		return -1;
	 }

		/**
	 * @param variables
	 * @param var
	 */
	private void sacarVariablesQueNoSirven(Set<Integer> variables, Integer var) {
		for (Iterator<Integer> iterator = variables.iterator(); iterator.hasNext();) {
			Integer variableABorrar = (Integer) iterator.next();

			if(variableABorrar > 0){
				positivos[var-1]--;
			} else {
				negativos[Math.abs(var)-1]--;
			}
		}
	} 
}
